#ifndef EXCELEDITOR_H
#define EXCELEDITOR_H

#include <QMainWindow>
#include <vector>


/* QString和std::string互转 */
#define		QString2StdString(x)	(QString(x).toStdString())
#define		StdString2QString(x)	(QString::fromLocal8Bit(std::string(x).c_str()))

QT_BEGIN_NAMESPACE
namespace Ui {
class ExcelEditor;
}
QT_END_NAMESPACE

class ExcelEditor : public QMainWindow
{
    Q_OBJECT

public:
    ExcelEditor(QWidget *parent = nullptr);
    ~ExcelEditor();
    //************************************
    // Method:    ExcelApplication
    // FullName:  加载Excel表驱动并设置Excel表的路径
    // Parameter: _excelPath: excel表的路径
    // Returns:   true加载成功，false加载失败
    // Time:	  2024/06/16
    //************************************
    bool ExcelApplication(const std::string& _excelPath);

    //************************************
    // Method:    SetReadWorkSheet
    // FullName:  设置读取的Excel表的第几个sheet表
    // Parameter: _num: 序号
    // Returns:   true加载成功，false加载失败
    // Time:	  2024/06/16
    //************************************
    bool SetReadWorkSheet(const int& _num);

    //************************************
    // Method:    GetSheetCount
    // FullName:  获取工作表的数目
    // Parameter: _sheetNum: 数目
    // Returns:   true成功，false失败
    // Time:	  2024/06/16
    //************************************
    bool GetSheetCount(int& _sheetNum);

    //************************************
    // Method:    GetRowColCount
    // FullName:  获取工作表的行数和列数
    // Parameter: _rows: 行数，_cols: 列数
    // Returns:   true成功，false失败
    // Time:	  2024/06/16
    //************************************
    bool GetRowColCount(int& _rows, int& _cols);

    //************************************
    // Method:    GetDataAt
    // FullName:  获取当前工作表指定行和列的数据
    // Parameter: _row: 指定行，_col: 指定列
    // Returns:   返回查找的数据
    // Time:	  2024/06/16
    //************************************
    QString QueryDataAt(const int& _row, const int& _col);

    //************************************
    // Method:    QueryAllData
    // FullName:  查询当前工作表的所有数据
    // Parameter: 无
    // Returns:   返回所有数据
    // Time:	  2024/06/16
    //************************************
    std::vector<std::vector<QString>> QueryAllData();

    //************************************
    // Method:    WriteDataAt
    // FullName:  写入当前工作表指定行和列的数据
    // Parameter: _row：指定行，_col：指定列，_value：修改后的值
    // Returns:   bool：成功返回true，失败返回false
    // Time:	  2024/07/16
    //************************************
    bool WriteDataAt(const int& _row,const int& _col, const std::string& _value);

    //************************************
    // Method:    WriteDataRange
    // FullName:  写入当前工作表范围的数据
    // Parameter: _start：起始索引，_end：结束索引，_value：范围值
    //              索引举例：A1，B3
    // Returns:   bool：成功返回true，失败返回false
    // Time:	  2024/07/16
    //************************************
    typedef  std::vector<std::vector<std::string>> RangeDate;
    bool WriteDataRange(const std::string& _start, const std::string& _end, const RangeDate& _value);

    //************************************
    // Method:    Close
    // FullName:  关闭Excel驱动
    // Parameter: 无
    // Returns:   true成功，false失败
    // Time:	     2024/06/16
    //************************************
    bool CloseExcel();

private:
    Ui::QtExcelEditorClass ui;

    QAxObject*          excel_          = nullptr;

    // 表示当前打开的所有工作簿（Workbook）的集合。
    QAxObject*          workBooks_      = nullptr;

    QAxObject*          workBook_       = nullptr;

    // 工作表
    QAxObject*          workSheet_ = nullptr;
};
#endif // EXCELEDITOR_H
